package com.blog.cmrpersonalblog.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.blog.cmrpersonalblog.dto.article.request.ArticleTagQueryRequest;
import com.blog.cmrpersonalblog.dto.article.response.ArticleTagResponse;
import com.blog.cmrpersonalblog.entity.ArticleTag;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 文章标签Mapper接口
 */
@Mapper
public interface ArticleTagMapper extends BaseMapper<ArticleTag> {

    /**
     * 分页查询标签列表
     * @param page 分页对象
     * @param query 查询条件
     * @return 标签列表
     */
    IPage<ArticleTagResponse> selectTagPage(Page<ArticleTagResponse> page,
                                           @Param("query") ArticleTagQueryRequest query);

    /**
     * 根据名称查询标签（用于重名检查）
     * @param name 标签名称
     * @param excludeId 排除的标签ID（用于更新时检查）
     * @return 标签信息
     */
    ArticleTag selectTagByName(@Param("name") String name, @Param("excludeId") Long excludeId);

    /**
     * 获取启用的标签列表
     * @return 启用的标签列表
     */
    List<ArticleTag> selectEnabledTags();

    /**
     * 搜索标签（用于自动完成）
     * @param keyword 关键词
     * @param limit 限制数量
     * @return 标签列表
     */
    List<ArticleTag> searchTags(@Param("keyword") String keyword, @Param("limit") Integer limit);

    /**
     * 批量更新标签状态
     * @param tagIds 标签ID列表
     * @param status 目标状态
     * @return 更新数量
     */
    int batchUpdateTagStatus(@Param("tagIds") List<Long> tagIds, @Param("status") Integer status);

    /**
     * 更新标签使用次数
     * @param tagId 标签ID
     * @param useCount 新的使用次数
     * @return 更新数量
     */
    int updateTagUseCount(@Param("tagId") Long tagId, @Param("useCount") Integer useCount);

    /**
     * 批量重新计算所有标签的使用次数
     * @return 更新数量
     */
    int recalculateAllTagUseCounts();

    /**
     * 获取标签统计信息
     * @return 统计信息
     */
    Map<String, Object> selectTagStatistics();

    /**
     * 获取热门标签列表
     * @param limit 限制数量
     * @return 热门标签列表
     */
    List<ArticleTag> selectPopularTags(@Param("limit") Integer limit);

    /**
     * 检查标签名称是否存在
     * @param name 标签名称
     * @param excludeId 排除的标签ID
     * @return 是否存在
     */
    boolean existsTagByName(@Param("name") String name, @Param("excludeId") Long excludeId);

    /**
     * 获取所有标签列表（按创建时间倒序）
     * @return 所有标签列表
     */
    List<ArticleTag> selectAllTags();

    /**
     * 批量查询标签信息
     * @param tagIds 标签ID列表
     * @return 标签列表
     */
    List<ArticleTag> selectTagsByIds(@Param("tagIds") List<Long> tagIds);
}